home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 2 / LSD and 17bit Compendium Deluxe - Volume II.iso / a / prog / asmsrc / icsources.lha / PROGRAMS / 64DEMO next >
Encoding:
Text File  |  1987-10-01  |  22.3 KB  |  1,021 lines

  1.      
  2.      section ax,code_c
  3.     opt c-,d+,w-,o+    
  4.     
  5.     include 'df2:insert/custom registers'
  6.     
  7. badd=(320*256)/8
  8.     
  9.     move.l #scrolltext,shag
  10.     lea $dff000,a6
  11.     move.w #$87e0,dmacon(a6)
  12.     jsr cop_init
  13.      move.l $6c,oldirq
  14.      move.l #newirq,$6c
  15. mse:
  16.      cmp.b #$70,$dff006
  17.      bne mse
  18.      cmpi.b #1,start
  19.      bne zog
  20.      move.w #$0fff,$dff180
  21.      jsr bpmusic
  22.      addi.l #1,countd
  23.      move.w #$088f,$dff180
  24.      cmpi.l #4000,countd
  25.      bne zog
  26.      move.l #0,countd
  27.      move.b #0,start
  28.      move.w #$0f,$dff096
  29. zog:
  30.      btst #6,$bfe001
  31.     bne mse
  32.      move.l oldirq,$6c
  33.      move.l copaddr,a0
  34.      move.l oldcop,(a0)
  35.      move.w #$0f,$dff096
  36. nolib:    
  37.      rts    
  38. newirq:  
  39.     movem.l d0-d7/a0-a6,$75000
  40.     cmpi.b #1,start
  41.     bne duggy
  42.     move.b #0,flash
  43.     jmp shau
  44. duggy:
  45.     cmpi.b #0,fast
  46.     bne stugz
  47.     addi.b #1,county
  48.     cmpi.b #19,county
  49.     bne shau2
  50.     clr.b county
  51.     cmpi.b #1,wait
  52.     bne shau1
  53.     addi.b #1,countg
  54.     cmpi.b #6,countg
  55.     bne shau
  56.     move.b #0,wait
  57.     move.b #0,countg
  58. shau1:    
  59.     cmpi.b #1,goob
  60.     bne stug
  61.     move.b #0,flash
  62.     move.b #0,goob
  63.     jsr prcurse
  64.     jmp stug
  65. stugz:    jsr printy1
  66.     jsr printy1
  67.     jsr printy1
  68.     jsr printy1
  69.     jsr printy1
  70.     jsr printy1
  71.     jsr printy1
  72.     jsr printy1
  73.     jsr printy1
  74. stug:
  75.     jsr printy1
  76. shau:    move.l asd1+2,a2
  77.     move.l a2,gh1+4
  78.     move.l a2,gh2+4
  79.     jsr prcurse    
  80. shau2:
  81.     movem.l $75000,d0-d7/a0-a6
  82.     dc.w $4ef9
  83.     
  84. oldirq: dc.l 0
  85. countd:    dc.l 0
  86.  
  87.     even
  88.  
  89. cop_init:
  90.      lea screen,a0
  91.      move.l a0,d0
  92.      move.w d0,lo1
  93.      swap d0
  94.      move.w d0,hi1
  95.      
  96.      lea screen+9000,a0
  97.      move.l a0,d0
  98.      move.w d0,alo1
  99.      swap d0
  100.      move.w d0,ahi1
  101.      
  102.      moveq #$00,d0
  103.      lea grafname,a1
  104.      move.l $4,a6
  105.      jsr -132(A6)
  106.      move.l $4,A6
  107.      jsr -408(a6)
  108.      tst d0
  109.      beq nolib
  110.      move.l d0,grafbase
  111.      move.l d0,a6
  112.      add.l #$32,d0
  113.      move.l d0,a0
  114.      move.l a0,copaddr
  115.      move.l (a0),oldcop
  116.      move.l #newcop,(a0)
  117.      rts
  118.  
  119.     even
  120.       
  121. grafname: dc.b "graphics.library",0
  122. grafbase: dc.l 0
  123. oldcop:   dc.l 0
  124. copaddr:  dc.l 0
  125. count:      dc.b 0
  126. flash:      dc.b 0
  127. county:      dc.b 0
  128. shag:      dc.l 0
  129. yaz:      dc.b 0
  130. countit:  dc.b 0
  131. gitk:      dc.b 0
  132. wait:      dc.b 0
  133. countg:      dc.b 0
  134. goob:      dc.b 0
  135. fast:      dc.b 0
  136. inv:      dc.b 0
  137. clrc:      dc.w 0
  138. frew:      dc.l 0
  139. start:      dc.b 0
  140.     even
  141.  
  142. newcop:     dc.w $0100,$1200
  143.       dc.w $0102
  144. boh:      dc.w $0088
  145.      dc.w $0120
  146. sp1l:     dc.w $0000,$0122
  147. sp1h:      dc.w $0000 
  148.      dc.w $0124
  149. sp2l:     dc.w $0000,$0126
  150. sp2h:      dc.w $0000 
  151.      dc.w $0128
  152. sp3l:     dc.w $0000,$012a
  153. sp3h:      dc.w $0000 
  154.      dc.w $012c
  155. sp4l:     dc.w $0000,$012e
  156. sp4h:      dc.w $0000
  157.      dc.w $0130
  158. sp5l:     dc.w $0000,$132
  159. sp5h:      dc.w $0000
  160.      dc.w $0180,$88f
  161.      dc.w $2001,$fffe
  162.      dc.w $00e0
  163. ahi1:     dc.w $0000
  164.      dc.w $00e2
  165. alo1:     dc.w $0000     
  166.  scr:       dc.w $3701,$fffe
  167.       dc.w $00e0
  168.  hi1:     dc.w $0000
  169.      dc.w $00e2
  170.  lo1:     dc.w $0000     
  171.      dc.w $008e,$3021 
  172.      dc.w $0090,$30f1
  173.      dc.w $0092,$0030
  174.      dc.w $0094,$00c8
  175.      dc.w $180,$88f
  176.      dc.w $182
  177. fds:     dc.w $44a,$184,$fdb,$186,$db9
  178.      dc.w $188,$c97,$18a,$a75,$18c,$853,$18e,$033,$190,$c60
  179.      dc.w $192,$ba5,$194,$962,$196,$530,$198,$db4,$19a,$558
  180.      dc.w $19c,$447,$19e,$336,$1a0,$a40,$1a2,$f44,$1a4,$b00
  181.      dc.w $1a6,$222,$1a8,$333,$1aa,$444,$1ac,$555,$1ae,$666
  182.      dc.w $1b0,$777,$1b2,$888,$1b4,$999,$1b6,$aaa,$1b8,$ccc
  183.      dc.w $1ba,$ddd,$1bc,$eee,$1be,$fff
  184.      dc.w $ff01,$fffe
  185.      dc.w $0182,$088f
  186.      dc.w $ffff,$fffe
  187.      
  188.      even
  189.  
  190. screen:
  191.     dcb.b badd,255
  192.      
  193. prcurse:
  194.      cmpi.b #1,fast
  195.      bne hugs
  196.      jmp gh2
  197. hugs:
  198.      cmpi.b #1,flash
  199.      bne gh2
  200. gh1:     move.b #0,screen
  201.      jmp bast
  202. gh2:     move.b #255,screen
  203. bast:
  204.      move.l gh1+4,a3
  205.      adda.l #40,a3
  206.      move.l a3,gh1+4
  207.      move.l gh2+4,a3
  208.      adda.l #40,a3
  209.      move.l a3,gh2+4
  210.      addi.b #1,count
  211.      cmpi.b #8,count
  212.      bne prcurse
  213.      move.b #0,count
  214.      cmpi.b #0,flash
  215.      bne shitz
  216.      move.b #1,flash
  217.      jmp ende
  218. shitz:     move.b #0,flash
  219. ende:     
  220.      rts
  221.           
  222. printy1:
  223.      move.l shag,a2
  224.      move.b (a2)+,yaz
  225.      move.l a2,shag
  226.      cmpi.b #0,yaz
  227.      bne juha
  228.      move.l #scrolltext,shag
  229.      rts
  230.      
  231. juha:
  232.      cmpi.b #9,yaz
  233.      bne juhb
  234.      move.w #0,fds
  235.      rts
  236. juhb:
  237.      cmpi.b #10,yaz
  238.      bne juhc
  239.      move.w #$fff,fds
  240.      rts
  241.      
  242. juhc:
  243.      cmpi.b #11,yaz
  244.      bne juh
  245.      move.w #$44a,fds
  246.      rts
  247.      
  248. juh:
  249.      cmpi.b #1,yaz
  250.      bne juh1
  251.      move.l asd1+2,a2
  252.      move.l a2,gh1+4
  253.      move.l a2,gh2+4
  254.      move.b #0,flash
  255.      jsr prcurse
  256.      move.b #1,goob
  257.      move.b gitk,d3
  258.      move.l asd1+2,a2
  259.      adda.l #320,a2
  260.      suba.l d3,a2
  261.      move.l a2,asd1+2
  262.      move.b #0,gitk
  263.      rts
  264. juh1:
  265.      cmpi.b #2,yaz
  266.      bne juh2
  267.      move.b #1,wait
  268.      rts
  269. juh2:
  270.      cmpi.b #3,yaz
  271.      bne juh3
  272.      move.b #1,fast
  273.      rts
  274. juh3:
  275.      cmpi.b #4,yaz
  276.      bne juh4
  277.      move.b #0,fast
  278.      rts
  279. juh4:
  280.      cmpi.b #5,yaz
  281.      bne juh5
  282.      move.b #1,inv
  283.      rts
  284. juh5:
  285.      cmpi.b #6,yaz
  286.      bne juh6
  287.      move.b #0,inv
  288.      rts
  289. juh6:
  290.      cmpi.b #7,yaz
  291.      bne juh7
  292. looper:  move.b #255,screen+7999
  293.      addi.w #1,clrc
  294.      move.l looper+4,a3
  295.      suba.l #1,a3
  296.      move.l a3,looper+4
  297.      cmpi.w #8000,clrc
  298.      bne looper
  299.      move.w #0,clrc
  300.      move.l #screen+7999,looper+4
  301.      move.l #screen,asd1+2
  302.      move.l #screen,gh1+4
  303.      move.l #screen,gh2+4
  304.      rts
  305. juh7: 
  306.      cmpi.b #8,yaz
  307.      bne juh9
  308. groop:
  309.      addi.l #1,frew
  310.      cmpi.l #400000,frew
  311.      bne groop
  312.      clr.l frew
  313.      rts
  314.  
  315. juh9:
  316.      cmpi.b #12,yaz
  317.      bne juh10
  318.      move.b #1,start
  319.      jsr bpinit
  320.      rts
  321. juh10:
  322.      move.l #Ascii,a3
  323.      move.l #pos,a4
  324.      move.b (a3)+,d3
  325.      move.w (a4),(a4)
  326. cmpr1:
  327.      cmp.b yaz,d3
  328.      beq printit1
  329.      move.b (a3)+,d3
  330.      move.w (a4),(a4)+
  331.      jmp cmpr1
  332.      rts
  333.      
  334. printit1:
  335.      move.l #chrset,a5
  336.      adda.w (a4),a5
  337.      move.l a5,as11+2
  338. as11:     move.b chrset,d0
  339.      cmpi.b #1,inv
  340.      bne asd1
  341.      not d0
  342. asd1:     move.b d0,screen
  343. loop1:     move.l as11+2,a3
  344.      adda.l #40,a3
  345.      move.l a3,as11+2
  346.      move.l asd1+2,a3
  347.      adda.l #40,a3
  348.      move.l a3,asd1+2
  349.      addi.b #1,countit
  350.      cmpi.b #8,countit
  351.      bne as11
  352.      move.b #0,countit
  353.      move.l #chrset,as11+2
  354.      move.l asd1+2,a4
  355.      suba.l #320,a4
  356.      adda.l #1,a4
  357.      addi.b #1,gitk
  358.      cmpi.b #40,gitk
  359.      bne stij
  360.      move.b #0,gitk
  361.      suba.l #40,a4
  362.      add.l #320,a4
  363. stij:   
  364.      move.l a4,asd1+2
  365.      rts
  366.      
  367.     
  368.      even
  369.      
  370. Ascii:
  371.      dc.b ' 1234567890.-@~,/+*()=%$#":;'
  372.      dc.b 'ABCDEFGHIJKLMNOPQRSTUVWXYZ!?<>'
  373.      dc.b 0
  374.      
  375.      even
  376.      
  377. pos:
  378.      dc.w 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
  379.      dc.w 21,22,23,24,25,26,27
  380.      dc.w 320,321,322,323,324,325,326,327,328,329,330
  381.      dc.w 331,332,333,334,335,336,337,338,339,340,341
  382.      dc.w 342,343,344,345,346,347,348,349
  383.      
  384.      even
  385.      
  386. scrolltext:
  387.          
  388.          DC.B 3,'                                         '
  389.          DC.B 3,2,'   **** COMMADORE 64 BYTES FREE ****   '
  390.      DC.B 3,2,'                                        '
  391.      DC.B 3,2,' 64K RAM SYSTEM 38911 BASIC BYTES FREE '
  392.      DC.B 3,2,'                                        '
  393.      DC.B 2,'                                         '
  394.      DC.B 2,'READY',1,2,4,4,4
  395.      dc.b 2,'LOAD "$",8',2,3,1
  396.      dc.b 'LOADING',8,1
  397.      dc.b 'READY.',1,2,4,4,4
  398.      dc.b 'LIST',2,3,1,5
  399.      dc.b '0 "HOT STUFF"        1988 ',6,1
  400.      dc.b '122  "CONVERTER"        PRG ',1
  401.      dc.b '50   "KOALA PAD"        PRG ',1
  402.      dc.b '28   "SPRITES"          PRG ',1
  403.      dc.b '0    "AX IN 1990"       AX! ',1
  404.      dc.b '17   "POD IN 1990"      POD ',1
  405.      dc.b '28   "INNER CITY 1990"  INC ',1
  406.      dc.b '90   "GREETINGS "       GRE ',1
  407.      dc.b '0    "****************" DEL ',1
  408.      dc.b '0    "*              *" DEL ',1
  409.      dc.b '0    "*   PRODUCED   *" DEL ',1
  410.      dc.b '0    "*FOR INNER CITY*" DEL ',1
  411.      dc.b '0    "*      BY      *" DEL ',1
  412.      dc.b '0    "*      AX      *" DEL ',1
  413.      dc.b '0    "*              *" DEL ',1
  414.      dc.b '0    "****************" DEL ',1  
  415.      dc.b '329 BLOCKS FREE     ',3,1
  416.      dc.b 'READY.',1,4
  417.      dc.b '',2,2,2,2,2,4,4,7
  418.      dc.b 'LOAD "AX*",8,1',2,3,1
  419.      dc.b 'LOADING',8,1
  420.      dc.b 'READY.',1,4,4,4,4,4,4
  421.      dc.b 'LIST',2,3,1
  422.      DC.B '10 PRINT"HELLO THIS IS POD OF INNER CITY ERE WITH A"',2,1
  423.      dc.b '20 PRINT "        NEW INTRO CODER BY AX"',2,10
  424.      dc.b 'READY.',1,4,4,4,4,4,4,4,4,4,4
  425.      dc.b 'RUN',2,3,1
  426.      dc.b 7,'HELLO THIS IS POD OF INNER CITY ERE WITH A ',1
  427.      dc.b '           NEW INTRO CODER BY AX',1
  428.      dc.b 1
  429.      dc.b 'READY.',1,4,4,4,4,4,4,4,4
  430.      dc.b 2
  431.      dc.b 'POKE 53281,0',3,1,9,4,4,4,4,4,4,4
  432.      dc.b 2,'POKE 53281,1',3,1,10,4,4,4,4,4,4,4,2
  433.      dc.b 'POKE 53281,6',3,1,11,4,4,4,4,4,4,2,2
  434.      dc.b 7
  435.      dc.b 'LOAD "$",8',2,3,1
  436.      dc.b 'LOADING',8,1
  437.      dc.b 'READY.',1,2,4,4,4
  438.      dc.b 'LIST',2,3,1,5
  439.      dc.b '0 "MUSIC DISK"       1989 ',6,1
  440.      dc.b '1    "COMMANDO HI PLAY" PRG ',1
  441.      dc.b '16   "COMMANDO HI MUS"  PRG ',1
  442.      dc.b '1    "CRAZYCOMETS PLAY" PRG ',1
  443.      dc.b '30   "CRAZYCOMETS MUS"  PRG ',1
  444.      dc.b '1    "GREEN BERET PLAY" PRG ',1
  445.      dc.b '31   "GREEN BERET MUS"  PRG ',1
  446.      dc.b '584 BLOCKS FREE      ',3,1
  447.      dc.b 'READY.',1,4,4,4,4,4,2
  448.      dc.b 'LOAD "COMMANDO HI PLAY",8,1',2,3,1
  449.      dc.b 'LOADING',8,1
  450.      dc.b 'READY.',1,4,4,4,2
  451.      dc.b 'LOAD "COMMANDO HI MUS",8,1',2,3,1
  452.      dc.b 'LOADING',8,8,1
  453.      dc.b 'READY.',1,4,4,4,4,4,7,2
  454.      dc.b 'SYS 49152',2,3,1,4,4,4,4,4,4,4,4,12
  455.      dc.b 3,7,1
  456.      dc.b 'READY.',1,4
  457.      DC.B 'SYS 64738',1,7
  458.      dc.b 0
  459.      
  460.      even
  461.      
  462. chrset:
  463.  
  464.      incbin 'df2:graphics/64.chrset.raw'
  465.      
  466.      ;special chars
  467.      ;1=RETURN
  468.      ;2=WAIT
  469.      ;3=FAST PRINT
  470.      ;4=SLOW PRINT
  471.      ;5=INVERSE PRINT
  472.      ;6=STANDARD PRINT
  473.      ;7=CLEAR SCRN
  474.      ;8=WAIT (NO CURSOR)
  475.      ;9=CHANGE SCREEN TO BLACK
  476.      ;10=CHANGE SCREEN TO WHITE
  477.      ;11=CHANGE SCREEN TO BLUE
  478.      ;12=START TUNE 1
  479.  
  480.  
  481. bpinit:        lea samples(pc),a0
  482.         lea bpsong(pc),a1
  483.         clr.b numtables
  484.         cmpi.w #'V.',26(a1)
  485.         bne.s bpnotv2
  486.         cmpi.b #'2',28(a1)
  487.         bne.s bpnotv2
  488.         move.b 29(a1),numtables
  489. bpnotv2:    move.l #512,d0
  490.         move.w 30(a1),d1        ;d1 now contains length in steps
  491.         moveq.l #1,d2             ;1 is highest pattern number
  492.         mulu #4,d1             ;4 voices per step
  493.         subq.w #1,d1             ;correction for DBRA
  494. findhighest:    cmp.w (a1,d0),d2        ;Is it higher
  495.         bge.s nothigher            ;No
  496.         move.w (a1,d0),d2        ;Yes, so let D2 be highest
  497. nothigher:    addq.l #4,d0             ;Next Voice
  498.         dbra d1,findhighest        ;And search
  499.         move.w 30(a1),d1
  500.         mulu #16,d1             ;16 bytes per step
  501.         move.l #512,d0             ;header is 512 bytes
  502.         mulu #48,d2             ;48 bytes per pattern
  503.         add.l d2,d0
  504.         add.l d1,d0             ;offset for samples
  505.         add.l #bpsong,d0
  506.         move.l d0,tables
  507.         moveq.l #0,d1
  508.         move.b numtables,d1        ;Number of tables
  509.         lsl.l #6,d1             ;x 64
  510.         add.l d1,d0
  511.         move.l #14,d1             ;15 samples
  512.         add.l #32,a1
  513. initloop:    move.l d0,(a0)+
  514.         cmpi.b #$ff,(a1)
  515.         beq.s bpissynth
  516.         move.w 24(a1),d2
  517.         mulu #2,d2             ;Length is in words
  518.         add.l d2,d0             ;offset next sample
  519. bpissynth:    add.l #32,a1             ;Length of Sample Part in header
  520.         dbra d1,initloop
  521.         rts
  522. bpmusic:    bsr bpsynth
  523.         subq.b #1,arpcount
  524.         moveq.l #3,d0
  525.         lea bpcurrent(pc),a0
  526.         move.l #$dff0a0,a1
  527. bploop1:    move.b 12(a0),d4
  528.         ext.w d4
  529.         add.w d4,(a0)
  530.         tst.b $1e(a0)
  531.         bne.s bplfo
  532.         move.w (a0),6(a1)
  533. bplfo:        move.l 4(a0),(a1)
  534.         move.w 8(a0),4(a1)
  535.         tst.b 11(a0)
  536.         bne.s bpdoarp
  537.         tst.b 13(a0)
  538.         beq.s not2
  539. bpdoarp:    tst.b arpcount
  540.         bne.s not0
  541.         move.b 11(a0),d3
  542.         move.b 13(a0),d4
  543.         and.w #240,d4
  544.         and.w #240,d3
  545.         lsr.w #4,d3
  546.         lsr.w #4,d4
  547.         add.w d3,d4
  548.         add.b 10(a0),d4
  549.         bsr bpplayarp
  550.         bra.s not2
  551. not0:        cmpi.b #1,arpcount 
  552.         bne.s not1
  553.         move.b 11(a0),d3
  554.         move.b 13(a0),d4
  555.         and.w #15,d3
  556.         and.w #15,d4
  557.         add.w d3,d4
  558.         add.b 10(a0),d4
  559.         bsr bpplayarp
  560.         bra.s not2
  561. not1:        move.b 10(a0),d4
  562.         bsr bpplayarp
  563. not2:        lea $10(a1),a1
  564.         lea $20(a0),a0
  565.         dbra d0,bploop1
  566.         tst.b arpcount
  567.         bne.s arpnotzero
  568.         move.b #3,arpcount
  569. arpnotzero:    subq.b #1,bpcount
  570.         beq.s bpskip1
  571.         rts
  572. bpskip1:    move.b bpdelay,bpcount
  573. bpplay:        bsr.s bpnext
  574.         move.w dma,$dff096
  575.         ;move.l #$1f4,d0        ;is this a waste ?????
  576. bpxx:        ;dbra d0,bpxx
  577.         moveq.l #3,d0
  578.         move.l #$dff0a0,a1
  579.         moveq.w #1,d1
  580.         lea bpcurrent(pc),a2
  581.         lea bpbuffer(pc),a5
  582. bploop2:    btst #15,(a2)
  583.         beq.s bpskip7
  584.         bsr bpplayit
  585. bpskip7:    asl.w #1,d1
  586.         lea $10(a1),a1
  587.         lea $20(a2),a2
  588.         lea $24(a5),a5
  589.         dbra d0,bploop2
  590.         rts
  591. bpnext:        clr.w dma
  592.         lea bpsong(pc),a0
  593.         move.l #$dff0a0,a3
  594.         moveq.l #3,d0
  595.         moveq.w #1,d7
  596.         lea bpcurrent(pc),a1
  597. bploop3:    moveq.l #0,d1
  598.         move.w bpstep,d1
  599.         lsl.w #4,d1
  600.         move.l d0,d2
  601.         lsl.l #2,d2
  602.         add.l d2,d1
  603.         add.l #512,d1
  604.         move.w (a0,d1),d2
  605.         move.b 2(a0,d1),st
  606.         move.b 3(a0,d1),tr
  607.         subq.w #1,d2
  608.         mulu #48,d2
  609.         moveq.l #0,d3
  610.         move.w 30(a0),d3
  611.         lsl.w #4,d3
  612.         add.l d2,d3
  613.         move.l #$00000200,d4
  614.         move.b bppatcount,d4
  615.         add.l d3,d4
  616.         move.l d4,a2
  617.         add.l a0,a2
  618.         moveq.l #0,d3 
  619.         move.b (a2),d3
  620.         tst.b d3
  621.         bne.s bpskip4
  622.         bra bpoptionals
  623. bpskip4:    clr.w 12(a1)              ;Clear autoslide/autoarpeggio
  624.         move.b 1(a2),d4
  625.         and.b #15,d4
  626.         cmpi.b #10,d4            ;Option 10->transposes off
  627.         bne.s bp_do1
  628.         move.b 2(a2),d4
  629.         and.b #240,d4              ;Higher nibble=transpose
  630.         bne.s bp_not1
  631. bp_do1:        add.b tr,d3
  632.         ext.w d3
  633. bp_not1:    move.b d3,10(a1)         ; Voor Arpeggio's
  634.         lea bpper(pc),a4
  635.         lsl.w #1,d3
  636.         move.w -2(a4,d3.w),(a1)
  637.         bset #15,(a1)
  638.         move.b #$ff,2(a1)
  639.         moveq.w #0,d3
  640.         move.b 1(a2),d3
  641.         lsr.b #4,d3
  642.         and.b #15,d3
  643.         tst.b d3
  644.         bne.s bpskip5
  645.         move.b 3(a1),d3 
  646. bpskip5:     move.b 1(a2),d4
  647.         and.b #15,d4
  648.         cmpi.b #10,d4             ;option 10
  649.         bne.s bp_do2
  650.         move.b 2(a2),d4
  651.         and.b #15,d4
  652.         bne.s bp_not2
  653. bp_do2:        add.b st,d3
  654. bp_not2:    cmpi.w #1,8(a1)
  655.         beq.s bpsamplechange
  656.         cmp.b 3(a1),d3
  657.         beq.s bpoptionals
  658. bpsamplechange:    move.b d3,3(a1)
  659.         or.w d7,dma
  660. bpoptionals:     moveq.l #0,d3
  661.         moveq.l #0,d4
  662.         move.b 1(a2),d3
  663.         and.b #15,d3
  664.         move.b 2(a2),d4
  665.         cmpi.b #0,d3            ; Optionals Here
  666.         bne.s notopt0
  667.         move.b d4,11(a1)
  668. notopt0:    cmpi.b #1,d3
  669.         bne.s bpskip3
  670.         move.w d4,8(a3)
  671.         move.b d4,2(a1)         ; Volume ook in BPCurrent
  672. bpskip3:    cmpi.b #2,d3              ; Set Speed
  673.         bne.s bpskip9
  674.         move.b d4,bpcount
  675.         move.b d4,bpdelay
  676. bpskip9:    cmpi.b #3,d3             ; Filter = LED control
  677.         bne.s bpskipa
  678.         tst.b d4
  679.         bne.s bpskipb
  680.         bset #1,$bfe001
  681.         bra.s bpskip2
  682. bpskipb:    bclr #1,$bfe001
  683. bpskipa:    cmpi.b #4,d3             ; PortUp
  684.         bne.s noportup
  685.         sub.w d4,(a1)             ; Slide data in BPCurrent
  686.         clr.b 11(a1)             ; Arpeggio's uit
  687. noportup:    cmpi.b #5,d3             ; PortDown
  688.         bne.s noportdn
  689.         add.w d4,(a1)             ; Slide down
  690.         clr.b 11(a1)
  691. noportdn:    cmpi.b #6,d3            ; SetRepCount
  692.         bne.s notopt6
  693.         move.b d4,bprepcount
  694. notopt6:    cmpi.b #7,d3            ; DBRA repcount
  695.         bne.s notopt7
  696.         subq.b #1,bprepcount
  697.         beq.s notopt7
  698.         move.w d4,bpstep
  699. notopt7:    cmpi.b #8,d3            ;Set AutoSlide
  700.         bne.s notopt8
  701.         move.b d4,12(a1)
  702. notopt8:    cmpi.b #9,d3            ;Set AutoArpeggio
  703.         bne.s notopt9
  704.         move.b d4,13(a1)
  705. notopt9:
  706. bpskip2:    lea $10(a3),a3
  707.         lea $20(a1),a1
  708.         asl.w #1,d7
  709.         dbra d0,bploop3   
  710.         addq.b #3,bppatcount
  711.         cmpi.b #48,bppatcount
  712.         bne.s bpskip8
  713.         move.b #0,bppatcount
  714.         addq.w #1,bpstep
  715.         lea bpsong(pc),a0
  716.         move.w 30(a0),d1
  717.         cmp.w bpstep,d1
  718.         bne.s bpskip8
  719.         move.w #0,bpstep
  720. bpskip8:    rts
  721. bpplayit:    bclr #15,(a2)
  722.         tst.l (a5)             ;Was EG used
  723.         beq.s noeg1             ;No ??
  724.         moveq.w #0,d3             ;Well then copy
  725.         move.l (a5),a4             ;Old waveform back
  726.         moveq #7,d7             ;to waveform tables
  727. eg1loop:    move.l 4(a5,d3.w),(a4)+        ;Copy...
  728.         addq.w #4,d3             ;Copy...
  729.         dbra d7,eg1loop            ;Copy...
  730. noeg1:        move.w (a2),6(a1)        ;Period from bpcurrent
  731.         moveq.l #0,d7
  732.         move.b 3(a2),d7            ;Instrument number
  733.         move.l d7,d6             ;Also in d6
  734.         lsl.l #5,d7             ;Header offset    
  735.         lea bpsong(pc),a3
  736.         cmpi.b #$ff,(a3,d7.w)        ;Is synthetic
  737.         beq.s bpplaysynthetic        ;Yes ??
  738.         clr.l (a5)             ;EG Off
  739.         clr.b $1a(a2)             ;Synthetic mode off
  740.         clr.w $1e(a2)             ;Lfo Off
  741.         add.l #24,d7             ;24 is name->ignore
  742.         lsl.l #2,d6             ;x4 for sample offset
  743.         move.l #samples,a4
  744.         move.l -4(a4,d6),d4        ;Fetch sample pointer
  745.         beq.s bp_nosamp            ;is zero->no sample
  746.         move.l d4,(a1)             ;Sample pointer in hardware
  747.         move.w (a3,d7),4(a1)        ;length in hardware
  748.         move.b 2(a2),9(a1)        ;and volume from bpcurrent
  749.         cmpi.b #$ff,2(a2)        ;Use default volume
  750.         bne.s skipxx             ;No ??
  751.         move.w 6(a3,d7),8(a1)        ;Default volume in hardware
  752. skipxx:     move.w 4(a3,d7),8(a2)        ;Length in bpcurrent
  753.         moveq.l #0,d6
  754.         move.w 2(a3,d7),d6        ;Calculate repeat
  755.         add.l d6,d4
  756.         move.l d4,4(a2)            ;sample start in bpcurrent
  757.         cmpi.w #1,8(a2)            ;has sample repeat part
  758.         bne.s bpskip6             ;Yes ??
  759. bp_nosamp:    move.l #null,4(a2)        ;Play no sample
  760.         bra.s bpskip10
  761. bpskip6:    move.w 8(a2),4(a1)        ;Length to hardware
  762.         move.l 4(a2),(a1)        ;pointer to hardware
  763. bpskip10:    or.w #$8000,d1            ;Turn on DMA for this voice
  764.         move.w d1,$dff096        ;Yeah, do it
  765.         rts
  766. bpplaysynthetic:move.b #$1,$1a(a2)        ;Synthetic mode on
  767.         clr.w $e(a2)             ;EG Pointer restart
  768.         clr.w $10(a2)             ;LFO Pointer restart
  769.         clr.w $12(a2)             ;ADSR Pointer restart
  770.         move.w 22(a3,d7.w),$14(a2)    ;EG Delay
  771.         addq.w #1,$14(a2)        ;0 is nodelay
  772.         move.w 14(a3,d7.w),$16(a2)    ;LFO Delay
  773.         addq.w #1,$16(a2)        ;So I need correction
  774.         move.w #1,$18(a2)        ;ADSR Delay->Start immediate
  775.         move.b 17(a3,d7.w),$1d(a2)    ;EG OOC
  776.         move.b 9(a3,d7.w),$1e(a2)    ;LFO OOC
  777.         move.b 4(a3,d7.w),$1f(a2)    ;ADSR OOC
  778.         move.b 19(a3,d7.w),$1c(a2)    ;Current EG Value
  779.         move.l tables,a4        ; so far so good,now what ??
  780.         moveq.l #0,d3            ;Pointer to waveform tables
  781.         move.b 1(a3,d7.w),d3        ;Which waveform
  782.         lsl.l #6,d3             ;x64 is length waveform table
  783.         add.l d3,a4
  784.         move.l a4,(a1)             ;Sample Pointer
  785.         move.l a4,4(a2)            ;In bpcurrent
  786.         move.w 2(a3,d7.w),4(a1)        ;Length in words
  787.         move.w 2(a3,d7.w),8(a2)        ;Length in bpcurrent
  788.         tst.b 4(a3,d7.w)        ;Is ADSR on
  789.         beq.s bpadsroff            ;No ??
  790.         move.l tables,a4        ;Tables
  791.         moveq.l #0,d3
  792.         move.b 5(a3,d7.w),d3        ;ADSR table number
  793.         lsl.l #6,d3             ;x64 for length
  794.         add.l d3,a4             ;Add it
  795.         moveq.w #0,d3
  796.         move.b (a4),d3             ;Get table value
  797.         add.b #128,d3             ;I want it from 0..255
  798.         lsr.w #2,d3             ;Divide by 4->0..63
  799.         cmpi.b #$ff,2(a2)
  800.         bne.s bpskip99
  801.         move.b 25(a3,d7.w),2(a2)
  802. bpskip99:    moveq.w #0,d4
  803.         move.b 2(a2),d4            ;Default volume
  804.         mulu d4,d3             ;default maal init volume
  805.         lsr.w #6,d3             ;divide by 64
  806.         move.w d3,8(a1)            ;is new volume
  807.         bra.s bpflipper
  808. bpadsroff:    move.b 2(a2),9(a1)
  809.         cmpi.b #$ff,2(a2)
  810.         bne.s bpflipper            ;No ADSR
  811.         move.b 25(a3,d7.w),9(a1)    ;So use default volume
  812. bpflipper:    move.l 4(a2),a4            ;Pointer on waveform
  813.         move.l a4,(a5)             ;Save it
  814.         moveq.w #0,d3             ;Save Old waveform
  815.         moveq #7,d4             ;data in bpbuffer
  816. eg2loop:    move.l (a4,d3.w),4(a5,d3.w)
  817.         addq.w #4,d3             ;Copy         
  818.         dbra d4,eg2loop
  819.         tst.b 17(a3,d7.w)        ;EG off
  820.         beq bpskip10            ;Yes ??
  821.         tst.b 19(a3,d7.w)        ;Is there an init value for EG
  822.         beq bpskip10            ;No ??
  823.         moveq.l #0,d3
  824.         move.b 19(a3,d7.w),d3
  825.         lsr.l #3,d3             ;Divide by 8 ->0..31
  826.         move.b d3,$1c(a2)        ;Current EG Value
  827.         subq.l #1,d3             ;-1,DBRA correction
  828. eg3loop:    neg.b (a4)+
  829.         dbra d3,eg3loop
  830.         bra bpskip10
  831. bpplayarp:    lea bpper(pc),a4
  832.         ext.w d4
  833.         asl.w #1,d4
  834.         move.w -2(a4,d4.w),6(a1)
  835.         rts
  836. bpsynth:    move.l #3,d0
  837.         lea bpcurrent(pc),a2
  838.         lea $dff0a0,a1
  839.         lea bpsong(pc),a3
  840.         lea bpbuffer(pc),a5
  841. bpsynthloop:    tst.b $1a(a2)             ;Is synthetic sound
  842.         beq.s bpnosynth            ;No ??
  843.         bsr.s bpyessynth            ;Yes         
  844. bpnosynth:    lea $24(a5),a5
  845.         lea $20(a2),a2
  846.         lea $10(a1),a1
  847.         dbra d0,bpsynthloop
  848.         rts
  849. bpyessynth:    moveq.w #0,d7
  850.         move.b 3(a2),d7            ;Which instr. was I playing
  851.         lsl.w #5,d7             ;x32, is length of instr.
  852.         tst.b $1f(a2)             ;ADSR off
  853.         beq.s bpendadsr            ;Yes ??
  854.         subq.w #1,$18(a2)        ;Delay,May I
  855.         bne.s bpendadsr            ;No ??
  856.         moveq.l #0,d3
  857.         move.b 8(a3,d7.w),d3
  858.         move.w d3,$18(a2)        ;Reset Delay Counter
  859.         move.l tables,a4
  860.         move.b 5(a3,d7.w),d3        ;Which ADSR table
  861.         lsl.l #6,d3             ;x64
  862.         add.l d3,a4             ;This is my table
  863.         move.w $12(a2),d3        ;Get ADSR table pointer
  864.         moveq.w #0,d4
  865.         move.b (a4,d3.w),d4        ;Value from table
  866.         add.b #128,d4             ;Want it from 0..255
  867.         lsr.w #2,d4             ;And now from 0..63
  868.         moveq.w #0,d3
  869.         move.b 2(a2),d3            ;Current Volume
  870.         mulu d3,d4             ;MultiPly with table volume
  871.         lsr.w #6,d4             ;Divide by 64=New volume
  872.         move.w d4,8(a1)            ;Volume in hardware
  873.         addq.w #1,$12(a2)        ;Increment of ADSR pointer
  874.         move.w 6(a3,d7.w),d4        ;Length of adsr table
  875.         cmp.w $12(a2),d4        ;End of table reached
  876.         bne.s bpendadsr            ;No ??
  877.         clr.w $12(a2)             ;Clear ADSR Pointer
  878.         cmpi.b #1,$1f(a2)        ;Once
  879.         bne.s bpendadsr            ;No ??
  880.         clr.b $1f(a2)             ;ADSR off
  881. bpendadsr:    tst.b $1e(a2)             ;LFO On
  882.         beq.s bpendlfo            ;No ??
  883.         subq.w #1,$16(a2)        ;LFO delay,May I
  884.         bne.s bpendlfo            ;No
  885.         moveq.l #0,d3
  886.         move.b 16(a3,d7.w),d3
  887.         move.w d3,$16(a2)        ;Set LFO Count
  888.         move.l tables,a4
  889.         move.b 10(a3,d7.w),d3        ;Which LFO table
  890.         lsl.l #6,d3             ;x64
  891.         add.l d3,a4
  892.         move.w $10(a2),d3        ;LFO pointer
  893.         moveq.l #0,d4
  894.         move.b (a4,d3.w),d4        ;That's my value
  895.         ext.w d4             ;Make it a word
  896.         ext.l d4             ;And a longword
  897.         moveq.l #0,d5
  898.         move.b 11(a3,d7.w),d5        ;LFO depth
  899.         tst.b d5
  900.         beq.s bpnotx
  901.         divs d5,d4             ;Calculate it
  902. bpnotx:        move.w (a2),d5             ;Period
  903.         add.w d4,d5             ;New Period
  904.         move.w d5,6(a1)            ;In hardware
  905.         addq.w #1,$10(a2)        ;Next position
  906.         move.w 12(a3,d7.w),d3        ;LFO table Length
  907.         cmp.w $10(a2),d3        ;End Reached
  908.         bne.s bpendlfo            ;NO ??
  909.         clr.w $10(a2)             ;Reset LFO Pointer
  910.         cmpi.b #1,$1e(a2)        ;Once LFO
  911.         bne.s bpendlfo            ;NO ??
  912.         clr.b $1e(a2)             ;LFO Off
  913. bpendlfo:    tst.b $1d(a2)             ;EG On
  914.         beq bpendeg             ;No ??
  915.         subq.w #1,$14(a2)        ;EG delay,May I
  916.         bne bpendeg             ;No
  917.         tst.l (a5)
  918.         beq.s bpendeg
  919.         moveq.l #0,d3
  920.         move.b 24(a3,d7.w),d3
  921.         move.w d3,$14(a2)        ;Set EG Count
  922.         move.l tables,a4
  923.         move.b 18(a3,d7.w),d3        ;Which EG table
  924.         lsl.l #6,d3             ;x64
  925.         add.l d3,a4
  926.         move.w $e(a2),d3        ;EG pointer
  927.         moveq.l #0,d4
  928.         move.b (a4,d3.w),d4        ;That's my value
  929.         move.l (a5),a4             ;Pointer to waveform
  930.         add.b #128,d4             ;0..255
  931.         lsr.l #3,d4             ;0..31
  932.         moveq.l #0,d3
  933.         move.b $1c(a2),d3        ;Old EG Value
  934.         move.b d4,$1c(a2)
  935.         add.l d3,a4             ;WaveForm Position
  936.         move.l a5,a6             ;Buffer
  937.         add.l d3,a6             ;Position
  938.         addq.l #4,a6             ;For adress in buffer
  939.         cmp.b d3,d4             ;Compare old with new value
  940.         beq.s bpnexteg            ;no change ??
  941.         bgt bpishigh            ;new value is higher
  942. bpislow:    sub.l d4,d3             ;oldvalue-newvalue
  943.         subq.l #1,d3             ;Correction for DBRA
  944. bpegloop1a:    move.b -(a6),d4
  945.         move.b d4,-(a4)
  946.         dbra d3,bpegloop1a  
  947.         bra.s bpnexteg
  948. bpishigh:    sub.l d3,d4             ;Newvalue-oldvalue
  949.         subq.l #1,d4             ;Correction for DBRA
  950. bpegloop1b:    move.b (a6)+,d3
  951.         neg.b d3
  952.         move.b d3,(a4)+            ;DoIt
  953.         dbra d4,bpegloop1b
  954. bpnexteg:    addq.w #1,$e(a2)        ;Next position
  955.         move.w 20(a3,d7.w),d3        ;EG table Length
  956.         cmp.w $e(a2),d3            ;End Reached
  957.         bne.s bpendeg             ;NO ??
  958.         clr.w $e(a2)             ;Reset EG Pointer
  959.         cmpi.b #1,$1d(a2)        ;Once EG
  960.         bne.s bpendeg             ;NO ??
  961.         clr.b $1d(a2)             ;EG Off
  962. bpendeg:    rts
  963.  
  964. null:        dc.w 0
  965. bpcurrent:    dc.w 0,0            ;periode,instrument =(volume.b,instr nr.b)
  966.         dc.l null            ;start
  967.         dc.w 1                ;length (words)
  968.         dc.b 0,0,0,0             ;noot,arpeggio,autoslide,autoarpeggio
  969.         dc.w 0,0,0            ;EG,LFO,ADSR pointers
  970.         dc.w 0,0,0            ;EG,LFO,ADSR count
  971.         dc.b 0,0            ;Synthetic yes/no, Volume Slide
  972.         dc.b 0,0            ;Current EG value,EG OOC
  973.         dc.b 0,0            ;LFO OOC,ADSR OOC
  974.  
  975.         dc.w 0,0
  976.         dc.l null
  977.         dc.w 1,0,0
  978.         dc.w 0,0,0,0,0,0,0,0,0
  979.  
  980.         dc.w 0,0
  981.         dc.l null
  982.         dc.w 1,0,0
  983.         dc.w 0,0,0,0,0,0,0,0,0
  984.  
  985.         dc.w 0,0
  986.         dc.l null
  987.         dc.w 1,0,0
  988.         dc.w 0,0,0,0,0,0,0,0,0
  989.  
  990. bpstep:        dc.w 0
  991. bppatcount:    dc.b 0
  992. st:        dc.b 0
  993. tr:        dc.b 0
  994. bpcount:    dc.b 1
  995. bpdelay:    dc.b 6
  996. arpcount:    dc.b 1
  997. bprepcount:    dc.b 1
  998. numtables:    dc.b 0
  999.  
  1000.         even
  1001.  
  1002. dma:        dc.w 0
  1003. tables:        dc.l 0
  1004.  
  1005. bpbuffer:    dcb.b 144,0
  1006.         dc.w 6848,6464,6080,5760,5440,5120,4832,4576,4320,4064,3840,3616
  1007.         dc.w 3424,3232,3040,2880,2720,2560,2416,2288,2160,2032,1920,1808
  1008.         dc.w 1712,1616,1520,1440,1360,1280,1208,1144,1080,1016,0960,0904
  1009.  
  1010. bpper:        dc.w 0856,0808,0760,0720,0680,0640,0604,0572,0540,0508,0480,0452
  1011.         dc.w 0428,0404,0380,0360,0340,0320,0302,0286,0270,0254,0240,0226
  1012.         dc.w 0214,0202,0190,0180,0170,0160,0151,0143,0135,0127,0120,0113
  1013.         dc.w 0107,0101,0095,0090,0085,0080,0076,0072,0068,0064,0060,0057
  1014.  
  1015. samples:    dcb.l 15,0
  1016.  
  1017. bpsong:        incbin "df2:modules/bp.commandohi"
  1018.  
  1019.         
  1020.      
  1021.